java swing焦点问题,焦点丢失,未调用focusgain
我有一个复杂而繁重的swing客户端应用程序,其中包含许多模态组件、jdialogs、内部框架等。在某些情况下,会出现问题,无法再关注swing文本字段。您可以单击一些JButton、JCheckbox,但不可能再在可编辑的jtextfields上聚焦和编辑值。可编辑文本字段的gainfocus事件不再触发,当您执行单击文本字段时,只调用requestfocus方法。 我找到了一种解决问题的方法(黑客),当问题发生时,你可以显示一些joptionpane消息或modal jdialog并通过单击或处理来关闭它,只要你点击文本字段并编辑它们,问题就会消失。 作为一个解决方案,我做了一些检查,如果你试图关注一个组件,我会在clicked textfield的requestfocus事件中启动一个计时器线程,并将实例保持为focusrequesting组件。过了一段时间,我通过
键盘管理器。getCurrentKeyboardFocusManager()。getPermanentFocusOwner()
如果没有出现问题,并且textfield获得了焦点,则返回的对象(getPermanentFocusOwner的retur值)与focusrequesting组件是同一个实例。但如果出现问题,返回的对象与请求的焦点不同,我通过以下方式打开我的临时jdialog:
JDialog dialog=new OptionPane().createDialog(KeyboardFocusManager.getCurrentFocusManager().getActiveWindow(), "");
dialog.setModal(true);
// MUST be modal to fix the lost focus case
// start closing thread, which closes the dialog after some few time by dialog.dispose
new Closer(dialog).start();
dialog.setVisible(true);
这个机制有效,我现在不太稳定。在某些情况下,对话框。dispose()不工作,临时窗口始终保持在屏幕上,不可关闭,并且由于它是模态的,客户端无法再执行任何操作。对话框必须是模态的才能解决焦点问题,因为非模态对话框不能解决上面声明的焦点问题。jdialog的dispose方法有很多同步块、互斥对象等,我认为会出现一些死锁
有更好的机制建议和想法吗?我知道最好的解决方案是检查当前的应用程序,分析它或重写它。但它非常复杂、沉重,而且模型和视图没有很好地组织。我的时间很短,因为客户正在等待,需要一些临时解决方案、技巧或黑客
# 1 楼答案
这是一个问题(非常常见),在
JTextField
中JWindow
没有父项(JFrame
),使用未修饰的JDialog
代替我在这里看到了
Focus
,FocusSubsystem
上Linux OS
和最后Java version
的一些问题,但从未导致阻止用户输入JTextField解决上午问题的最佳方法是RequestFocusListenerby
@camickr
dialog.setVisible(true);
应该用invokeLater()
包装,更多信息请参见Initial Thread (valid for all Top-Level Containers created on runtime too)你的问题中没有明确的内容,没有发布一个SSCCE、简短、可运行、可编译、可交易、由上午问题引起的